﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace Policy_server
{
    class PolicyServer
    {
        private byte[] policy;
        public PolicyServer(string policyFile)
        {
            FileStream policyStream = new FileStream(policyFile, FileMode.Open);
            policy = new byte[policyStream.Length];
            policyStream.Read(policy, 0, policy.Length);
            policyStream.Close();
        }

        private TcpListener listener;


        //проверяется доступ клиентов с помощью файла политики
        public void Start()
        {
            listener = new TcpListener(IPAddress.Any, 943);
            listener.Start();
            listener.BeginAcceptTcpClient(OnAcceptTcpClient, null);//прослушивание попыток входящих подключений
        }

        public void OnAcceptTcpClient(IAsyncResult ar)
        {
            if (isStopped) return; //чтобы при закрытии сервера не было попыток подключения
            Console.WriteLine("Received policy request.");
            listener.BeginAcceptTcpClient(OnAcceptTcpClient, null);
            try
            {
                TcpClient client = listener.EndAcceptTcpClient(ar);// принимаем входящее подключение и создаем новый TcpClient для связи в удаленным узлом
                PolicyConnection policyConnection = new PolicyConnection(client, policy);//создаем объек PolicyConnection, передовая буфер с политикой
                policyConnection.HandleRequest();
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }
        }

        private bool isStopped;
        public void Stop()
        {
            isStopped = true;
            try
            {
                listener.Stop();//прекращение ожидания передачи
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }
        }
    }
}
